home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-04 / win-fort.zip / DRAWFACE.FOR < prev    next >
Text File  |  1991-11-09  |  5KB  |  136 lines

  1. $DEFINE GDI
  2. $DEFINE USER
  3.       INCLUDE 'WINDOWS.FI'
  4.       SUBROUTINE DRAW_FACE
  5.       IMPLICIT NONE
  6. C
  7. C Author       : Kevin B Black
  8. C Date written : 23-Oct-1991
  9. C Abstract     :
  10. C
  11. C DRAW ANALOGUE CLOCK
  12. C
  13. C Subroutine to handle computation of window size specific values for the
  14. C clock face and hand, and to draw the clock face (spots and numbers).
  15. C
  16.       INCLUDE 'WINDOWS.FD'        ! Include windows functions and parameters
  17.       INTEGER*2 I,J,X,Y,IDIGIT    ! Work integers
  18.       REAL F,COSA,SINA            ! Work reals
  19.       INTEGER*2 XSPOT,YSPOT       ! Offsets to create spots on clock face
  20.       INTEGER*2 XDOT,YDOT         ! Offsets tp create dots on clock face
  21.       INCLUDE 'FWCLOCK.FD'        ! Include FWClock variables and parameters
  22.  
  23. C
  24. C Set centre coordinates and radius of clock face
  25. C
  26.       IF(WWIDTH.GT.WHEIGHT)THEN
  27.          RADIUS=WHEIGHT/2
  28.       ELSE
  29.          RADIUS=WWIDTH/2
  30.       ENDIF
  31.       IF(.NOT.IMANICON)RADIUS=RADIUS*0.95
  32.       AXC=WWIDTH/2
  33.       AYC=WHEIGHT/2
  34. C
  35. C Compute the sizes of the minute and hour `spots' for the clock face.
  36. C
  37.       IF(.NOT.IMANICON)THEN
  38.          XSPOT=NINT(FLOAT(RADIUS)/60.0)
  39.          YSPOT=NINT(FLOAT(RADIUS)/60.0*VARATIO)
  40.          IF(XSPOT.EQ.0.OR.YSPOT.EQ.0)THEN
  41.             XSPOT=1
  42.             YSPOT=1
  43.          ENDIF
  44.          XDOT=1+NINT(FLOAT(RADIUS)/320.0)
  45.          YDOT=1.0+NINT(FLOAT(RADIUS)/320.0*VARATIO)
  46.       ENDIF
  47. C
  48. C Compute the vectors for the second hand for each minute of arc.
  49. C
  50.       DO I=0,59
  51.          IF(I.GE.30)THEN
  52.             J=I-30
  53.          ELSE
  54.             J=I+30
  55.          ENDIF
  56.          IF(IMANICON)THEN
  57.             SHANDV(1,I).X=AXC
  58.             SHANDV(1,I).Y=AYC
  59.          ELSE
  60.             F=FLOAT(RADIUS)*0.10
  61.             SHANDV(1,I).X=AXC+NINT(F*SIN(PI-FLOAT(J)*ZINC))
  62.             SHANDV(1,I).Y=AYC+NINT(F*COS(PI-FLOAT(J)*ZINC)*VARATIO)
  63.          ENDIF
  64.          F=FLOAT(RADIUS)*0.695
  65.          SHANDV(2,I).X=AXC+NINT(F*SIN(PI-FLOAT(I)*ZINC))
  66.          SHANDV(2,I).Y=AYC+NINT(F*COS(PI-FLOAT(I)*ZINC)*VARATIO)
  67.       ENDDO
  68. C
  69. C Compute the vectors for the hour hand when FWClock is in the iconic state
  70. C
  71.       IF(IMANICON)THEN
  72.          DO I=0,59
  73.             COSA=COS(PI-FLOAT(I)*ZINC)
  74.             SINA=SIN(PI-FLOAT(I)*ZINC)
  75.             F=FLOAT(RADIUS)*0.45
  76.             HHAND2(I).X=AXC+NINT(F*SINA)
  77.             HHAND2(I).Y=AYC+NINT(F*COSA*VARATIO)
  78.             F=FLOAT(RADIUS)*0.65
  79.             MHAND2(I).X=AXC+NINT(F*SINA)
  80.             MHAND2(I).Y=AYC+NINT(F*COSA*VARATIO)
  81.          ENDDO
  82.       ENDIF
  83. C
  84. C Select pen and brushes for drawing clock face
  85. C
  86.       WSTATUS=SelectObject(FWCPS.HDC,FPEN)
  87.       WSTATUS=SelectObject(FWCPS.HDC,FBRUSH)
  88. C
  89. C Fill in the clock area
  90. C
  91.       WSTATUS=FillRect(FWCPS.HDC,RCLOCK,BBRUSH)
  92. C
  93. C Label face, digits are drawn by the routine DIGIT, see later for
  94. C more information. Also a single point is drawn at each of the
  95. C second positions and a small circle at each five-minute interval
  96. C (adjacent to the numerals).
  97. C
  98.       DO I=1,60
  99.          COSA=COS(PI-FLOAT(I)*ZINC)
  100.          SINA=SIN(PI-FLOAT(I)*ZINC)
  101.          X=AXC+NINT(FLOAT(RADIUS)*0.7*SINA)
  102.          Y=AYC+NINT(FLOAT(RADIUS)*0.7*COSA*VARATIO)
  103.          IF((I/5)*5.EQ.I)THEN
  104.             IF(IMANICON)THEN
  105.                TRECT.LEFT=X-1
  106.                TRECT.TOP=Y+1
  107.                TRECT.RIGHT=X
  108.                TRECT.BOTTOM=Y
  109.                WSTATUS=FillRect(FWCPS.HDC,TRECT,FBRUSH)
  110.             ELSE
  111.                WSTATUS=Ellipse(FWCPS.HDC,X-XSPOT,Y+YSPOT,
  112.      *                                   X+XSPOT,Y-YSPOT)
  113.                IDIGIT=I/5
  114.                X=AXC+NINT(FLOAT(RADIUS)*0.85*SINA)
  115.                Y=AYC+NINT(FLOAT(RADIUS)*0.85*COSA*VARATIO)
  116.                IF(IDIGIT.LT.10)THEN
  117.                   CALL DIGIT(X,Y,IDIGIT,.TRUE.,0)
  118.                ELSE IF(IDIGIT.EQ.10)THEN
  119.                        CALL DIGIT(X,Y,1,.TRUE.,-10)
  120.                        CALL DIGIT(X,Y,0,.FALSE.,0)
  121.                     ELSE IF(IDIGIT.EQ.11)THEN
  122.                             CALL DIGIT(X,Y,1,.TRUE.,-10)
  123.                             CALL DIGIT(X,Y,1,.FALSE.,0)
  124.                          ELSE IF(IDIGIT.EQ.12)THEN
  125.                                  CALL DIGIT(X,Y,1,.TRUE.,-10)
  126.                                  CALL DIGIT(X,Y,2,.FALSE.,0)
  127.                               ENDIF
  128.             ENDIF
  129.          ELSE IF(.NOT.IMANICON)THEN
  130.                  WSTATUS=Rectangle(FWCPS.HDC,X-XDOT,Y+XDOT,
  131.      *                                       X+XDOT,Y-YDOT)
  132.               ENDIF
  133.       ENDDO
  134.       RETURN
  135.       END
  136.